package ar.uba.dc.sistemas.monitorRW;

/**
 * Esta interfaz es la que define los metodos que deben implementar los monitores.
 * Esta hecha para un ejemplo en el que hayan multiples lectores y escritores
 * en donde pueden haber varios lectores leyendo a la vez pero a lo sumo un 
 * thread escribiendo por vez.
 * No puede pasar que un thread este leyendo mientras haya uno escribiendo o al reves
 * Basicamente, se evitan los conflictos W/R - W/W - R/W.
 *
 * @author Hernan Berroja Albiz / German del Tuffo
 * @version 0.1
 */

public interface MultipleReadersWritersMonitor {
    /**
     * Estos metodos se llaman para manejar la lectura en el recurso compartido. 
     * en el caso que no se pueda acceder, se esperara el recurso.
     * 
     * <pre>
     * 	monitor.comenzarLectura();
     * 	try {
     * 	   ... read ...
     * 	} finally {
     * 	   monitor.detenerLectura();
     * 	}
     * </pre>
     *
     */
    public abstract void comenzarLectura()
            throws InterruptedException;

    /**
     * cuando se termina de leer el recurso, se envia este mensaje.
     */
    public abstract void detenerLectura();

    /**
     * Estos metodos se llaman para manejar la escritura en el recurso compartido. 
     * en el caso que no se pueda acceder, se esperara el recurso.
     * 
     * Pattern for use:
     * 
     * <pre>
     * 	monitor.comenzarEscritura();
     * 	try {
     * 	   ... write ...
     * 	} finally {
     * 	   monitor.detenerEscritura();
     * 	}
     * </pre>
     *
     * 
     */
    public abstract void comenzarEscritura()
            throws InterruptedException;

    /**
     * cuando se termina de escribir el recurso, se envia este mensaje.
     */
    public abstract void detenerEscritura();

    /**
     * este metodo brinda algo de informacion acerca del "tipo" de monitor que se esta usando.
     *
     * @return una descripcion del monitor.
     */
    public abstract String getMonitorInfo();

    /**
     * resetea el monitor. hace un interrupt de los threads en el 
     * monitor y luego espera un tiempo antes de hacer el reset.
     */
    public abstract void reset();
}

